<?php
/**
 * 
 * Clase de eventos
 * @author Joan Muñoz
 * 
 */
class Evento {
  
  const EVENTS_IMAGE_DIR_BIG = 'img/uploads/events/655x308';
  const EVENTS_IMAGE_DIR_SMALL = 'img/uploads/events/202x95';
  const EVENTS_IMAGE_BIG_WIDTH = 655;
  const EVENTS_IMAGE_BIG_HEIGHT = 308;
  const EVENTS_IMAGE_SMALL_WIDTH = 202;
  const EVENTS_IMAGE_SMALL_HEIGHT = 95;
  const EVENTS_PDF_DIR = 'pdf/eventos';
	
  /**
   * Constructor.
   * @author Joan Muñoz
   */
	function __construct($action) {
		if ($action == 'savecategory') {
			$this->saveCategory($_POST);
		} else if ($action == 'deletecategory') {
		  $this->deleteCategory($_POST);
		} else if ($action == 'editcategory') {
		  $this->editCategory($_POST);
		} else if ($action == 'getplaces') {
			$this->getPlaces($_POST);
		} else if ($action == 'saveevent') {
		  $this->saveEvent($_POST);
		} else if($action == 'deleteevent') {
			$this->deleteEvent($_POST);
		} else if($action == 'getevent') {
			$this->getEvent($_POST);
		}
	}
  
  /**
   * 
   * Guarda una nueva categoria
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function saveCategory($post) {
    require_once '../../config.php';
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Categoría guardada.',
      'id' => ''
    );
    
    // Inserta la categoría
    try {
      mysql_select_db(DB_NAME, $conexion);
      mysql_query("SET NAMES utf8");
      $query = "INSERT INTO temporada (nombre, nombre_en, tipo)";
      $query .= "VALUES ('%s', '%s', '%s')";
      $query = sprintf($query,
        mysql_escape_string($post['nombre']),
        mysql_escape_string($post['nombre_en']),
        mysql_escape_string($post['tipo']));
      mysql_query($query) or die(mysql_error());
      $id = mysql_insert_id();
      
      $Error->id = $id;
    } catch (Exception $e) {
      $Error->error = TRUE;
      $Error->message = $e->getMessage();
    }
    
    echo json_encode($Error);
    mysql_close($conexion);
  }
  
  /**
   * 
   * Edita una categoría
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function editCategory($post) {
    require_once '../../config.php';
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Categoría editada.'
    );
    
    mysql_select_db(DB_NAME, $conexion);
    
    // Edita el nombre
    mysql_query("SET NAMES utf8");
    $query = "UPDATE temporada SET nombre = '%s', nombre_en = '%s', tipo = '%s' ";
    $query .= "WHERE id = %d";
    $query = sprintf($query,
      mysql_escape_string($post['nombre']),
      mysql_escape_string($post['nombre_en']),
      mysql_escape_string($post['tipo']),
      intval($post['id']));
    mysql_query($query);
    
    // Verifica si hubo algún error
    if ( mysql_error() ) {
      $Error->error = TRUE;
      $Error->message = 'Ocurrio el siguiente error: '. mysql_error();
    }
    
    // Regresa un JSON con el error si hubo alguno
    echo json_encode($Error);
    mysql_close($conexion);
  }
  
  /**
   * 
   * Elimina una categoría
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function deleteCategory($post) {
    require_once '../../config.php';
    $temporada_id = $post['id'];
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Categoría eliminada con éxito.'
    );
    
    mysql_select_db(DB_NAME, $conexion);
    
    // Elimina los eventos que pertenecen a esta temporada
    $query = sprintf("DELETE FROM evento WHERE temporada_id = %d",
      intval($temporada_id));
    mysql_query($query);
    
    if ( mysql_error() ) {
      $Error->error = TRUE;
      $Error->message = mysql_error();
      echo json_encode($Error);
      
      return;
    }
    
    // Elimina la temporada
    $query = sprintf("DELETE FROM temporada WHERE id = %d",
      intval($temporada_id));
    mysql_query($query);
    
    if ( mysql_error() ) {
      $Error->error = TRUE;
      $Error->message = mysql_error();
      echo json_encode($Error);
      
      return;
    }
      
    echo json_encode($Error);
    mysql_close($conexion);
  }
  
   /**
   * 
   * Obtiene las locaciones  de una sede
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function getPlaces($post) {
    require_once '../../config.php';
    $sede_id = $post['sede_id'];
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Locaciones encontradas con éxito.',
      'localidades' => array()
    );
    
    // Trae las localidades
    mysql_select_db(DB_NAME, $conexion);
    $query = sprintf("SELECT * FROM localidad WHERE sede_id = %d", 
      intval($sede_id));
    $localidades_result = mysql_query($query);
    
    if ( mysql_error() ) {
      $Error->error = TRUE;
      $Error->message = mysql_error();
      echo json_encode($Error);
      
      return;
    }
    
    while ( $localidad = mysql_fetch_assoc($localidades_result) ) {
      $Error->localidades['id'][] = $localidad['id'];
      $Error->localidades['nombre'][] = $localidad['nombre'];
      $Error->localidades['costo'][] = $localidad['costo'];
    }
    
    echo json_encode($Error);
    
    mysql_free_result($localidades_result);
    mysql_close($conexion);
  }
  
  /**
   * 
   * Guarda un nuevo evento
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function saveEvent($post) {
    require_once '../../config.php';
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Evento guardado con éxito.',
      'callback' => NULL,
      'arguments' => NULL
    );
    
    // Almacena los datos
    $id = $post['evento_id'];
    $programa = $post['programa'];
    $programa_en = $post['programa_en'];
    $titulo = $post['titulo'];
    $titulo_en = $post['titulo_en'];
    $descripcion = $post['descripcion'];
    $descripcion_en = $post['descripcion_en'];
    $estado = $post['estado'];
    $temporada_id = intval($post['temporada_id']);
    $sede_id = intval($post['sede_id']);
    
    // Guarda el evento
    mysql_select_db(DB_NAME, $conexion);
    mysql_query("SET NAMES utf8");
    
    if ($id == '') {
    	$query = "INSERT INTO evento (programa, programa_en, titulo, titulo_en, descripcion, descripcion_en, estado, temporada_id, sede_id) ";
    	$query .= "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d)";
    } else {
    	$query = "UPDATE evento SET programa = '%s', programa_en = '%s', titulo = '%s', titulo_en = '%s', descripcion = '%s', descripcion_en = '%s', estado = '%s', temporada_id = %d, sede_id = %d ";
    	$query .= "WHERE id = " . $id;
    }
    $query = sprintf($query,
      mysql_escape_string($programa),
      mysql_escape_string($programa_en),
      mysql_escape_string($titulo),
      mysql_escape_string($titulo_en),
      mysql_escape_string($descripcion),
      mysql_escape_string($descripcion_en),
      mysql_escape_string($estado),
      $temporada_id,
      $sede_id);
    mysql_query($query);
    
    if( mysql_error() ) {
      $Error->error = TRUE;
      $Error->message = mysql_error();
      $this->printJavascript($Error);
      
      return;
    }
    
    $evento_id = ($id == '') ? mysql_insert_id() : $id;
    
    // Sube la imagen
    if ( $_FILES['file_image']["name"] != '' ) {
      if ($_FILES["file_image"]["error"] == UPLOAD_ERR_OK) {
        if ( pathinfo($_FILES['file_image']['name'], PATHINFO_EXTENSION) == 'jpg' ) {
          require_once '../../classes/QuarkImage.php';
          $uploads_dir_big = PATH . self::EVENTS_IMAGE_DIR_BIG;
          
          $tmp_name = $_FILES["file_image"]["tmp_name"];
          $name = $evento_id. '.jpg';
          move_uploaded_file($tmp_name, "$uploads_dir_big/$name");
          chmod("$uploads_dir_big/$name", 0777);
          
          try {
            $Image = new QuarkImage();
            $Image->resize("$uploads_dir_big/$name", "$uploads_dir_big/$name", 
                self::EVENTS_IMAGE_BIG_WIDTH, self::EVENTS_IMAGE_BIG_HEIGHT);
            chmod("$uploads_dir_big/$name", 0777);
            
            $uploads_dir_small = PATH . self::EVENTS_IMAGE_DIR_SMALL;
            $Image->resize("$uploads_dir_big/$name", "$uploads_dir_small/$name", 
                self::EVENTS_IMAGE_SMALL_WIDTH, self::EVENTS_IMAGE_SMALL_HEIGHT);
            chmod("$uploads_dir_small/$name", 0777);
          } catch (QuarkImageException $e) {
          	if ($id == '') // Si no es editar
            	mysql_query("DElETE FROM evento WHERE id = ".$evento_id);
            
            $Error->error = TRUE;
            $Error->message = $e->getMessage();
            $this->printJavascript($Error);
          
            return;
          }          
        } else {
        	if ($id == '') // Si no es editar
          	mysql_query("DElETE FROM evento WHERE id = ".$evento_id);
          
          $Error->error = TRUE;
          $Error->message = 'La imagen debe ser .jpg';
          $this->printJavascript($Error);
          
          return;
        }
      }
    }
    
    // Sube el PDF en español
     if ( $_FILES['pdf']["name"] != '' ) {
      $uploads_dir = PATH . self::EVENTS_PDF_DIR;
      if ($_FILES["pdf"]["error"] == UPLOAD_ERR_OK) {
        if ( pathinfo($_FILES['pdf']['name'], PATHINFO_EXTENSION) == 'pdf' ) {
          $tmp_name = $_FILES["pdf"]["tmp_name"];
          $name = $evento_id. '.pdf';
          move_uploaded_file($tmp_name, "$uploads_dir/es/$name");
          chmod("$uploads_dir/$name", 0777);
        } else {
        	if ($id == '') // Si no es editar
          	mysql_query("DElETE FROM evento WHERE id = ".$evento_id);
          
          $Error->error = TRUE;
          $Error->message = 'Por favor utilice un archivo pdf';
          $this->printJavascript($Error);
          
          return;
        }
      }
    }
    
   // Sube el PDF en Inglés
     if ( $_FILES['pdf_en']["name"] != '' ) {
      $uploads_dir = PATH . self::EVENTS_PDF_DIR;
      if ($_FILES["pdf_en"]["error"] == UPLOAD_ERR_OK) {
        if ( pathinfo($_FILES['pdf_en']['name'], PATHINFO_EXTENSION) == 'pdf' ) {
          $tmp_name = $_FILES["pdf_en"]["tmp_name"];
          $name = $evento_id. '.pdf';
          move_uploaded_file($tmp_name, "$uploads_dir/en/$name");
          chmod("$uploads_dir/$name", 0777);
        } else {
        	if ($id == '') // Si no es editar
          	mysql_query("DElETE FROM evento WHERE id = ".$evento_id);
          
          $Error->error = TRUE;
          $Error->message = 'Por favor utilice un archivo pdf';
          $this->printJavascript($Error);
          
          return;
        }
      }
    }
    
    // Si es editar elimina las fechas anteriores
    if ($id != '') {
    	$query = sprintf("DELETE FROM fecha WHERE evento_id = %d", 
    		intval($evento_id)
    	);
    	mysql_query($query);
    }
    
    // Inserta las fechas
    foreach ($post['fecha'] as $key => $value) {
      $query = "INSERT INTO fecha (fecha, hora, minuto, evento_id) ";
      $query .= "VALUES ('%s', '%s', '%s', %d)";
      $query = sprintf($query,
        mysql_escape_string($post['fecha'][$key]),
        mysql_escape_string($post['hora'][$key]),
        mysql_escape_string($post['minutos'][$key]),
        $evento_id
      );
      mysql_query($query);
      
      if( mysql_error() ) {
        $Error->error = TRUE;
        $Error->message = mysql_error();
        $this->printJavascript($Error);
        
        return;
      }
    }
    
    // Si es editar elimina las localidades
    if ($id != '') {
    	$query = sprintf("DELETE FROM localidad_evento WHERE evento_id = %d",
     		intval($evento_id)
    	);
    	mysql_query($query);
    }
    
    // Inserta las localidades
    foreach ($post['precio'] as $key => $value) {
      $query = "INSERT INTO localidad_evento (nombre, costo, evento_id) ";
      $query .= "VALUES ('%s', '%s', %d)";
      $query = sprintf($query,
        mysql_escape_string($post['localidades'][$key]),
        mysql_escape_string($post['precio'][$key]),
        intval($evento_id)
      );
      mysql_query($query);
      
      if( mysql_error() ) {
        $Error->error = TRUE;
        $Error->message = mysql_error();
        $this->printJavascript($Error);
        
        return;
      } 
    }
    
    // Si todo salió bien
    // Si es editar
    if ($id != '') {
    	$callback = editEventRow;
    } else {
    	$callback = createEventRow;
    }
    $Error->callback = $callback;
    $Error->arguments = (object) array(
      'id' => $evento_id,
      'programa' => $programa,
      'titulo' => $titulo,
      'fechas' => $post['fecha'],
    	'estado' => $estado
    );
    $this->printJavascript($Error);
  
  }
  /**
   * 
   * Elimina un evento
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function deleteEvent($post) {
  	require_once '../../config.php';
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Evento eliminado con éxito.'
    );
    
    $query = sprintf("DELETE FROM evento WHERE id = %d", intval($post['id']));
    mysql_query($query);
    
    if ( mysql_error() ) {
    	$Error->error = TRUE;
    	$Error->message = mysql_error();
    	$this->printJavascript($Error);
        
      return;
    }
    
    @unlink(self::EVENTS_IMAGE_DIR_BIG . '/' . $post['id'] . '.jpg');
    @unlink(self::EVENTS_IMAGE_DIR_SMALL . '/' . $post['id'] . '.jpg');
    @unlink(self::EVENTS_PDF_DIR . '/' . $post['id'] . '.pdf');
    
   	echo json_encode($Error);
    
  }
  
  /**
   * 
   * Obtiene un evento
   * @param array $post -> Los argumentos enviados por POST
   * @return JSON -> Indica si hubo o no error y el mensaje
   * @author Joan Muñoz
   * 
   */
  public function getEvent($post) {
  	require_once '../../config.php';
    
    $Error = (object) array(
      'error' => FALSE,
      'message' => 'Evento encontrado',
      'evento' => array(),
    	'fechas' => array(),
    	'localidades' => array()
    );
    
    // Trae el evento
    mysql_select_db(DB_NAME, $conexion);
    $query = sprintf("SELECT * FROM evento WHERE id = %d", 
    	intval($post['id'])
    );
    $evento_result = mysql_query($query);
    $evento = mysql_fetch_assoc($evento_result);
    
    if ( mysql_error() ) {
      $Error->error = TRUE;
      $Error->message = mysql_error();
      echo json_encode($Error);
      
      return;
    }
    
    // Guarda el evento
    $Error->evento['id'] = $evento['id'];
    $Error->evento['programa'] = $evento['programa'];
    $Error->evento['programa_en'] = $evento['programa_en'];
    $Error->evento['titulo'] = $evento['titulo'];
    $Error->evento['titulo_en'] = $evento['titulo_en'];
    $Error->evento['descripcion'] = $evento['descripcion'];
    $Error->evento['descripcion_en'] = $evento['descripcion_en'];
    $Error->evento['estado'] = $evento['estado'];
    $Error->evento['sede_id'] = $evento['sede_id'];
    
    // Trae las fechas
    $query = sprintf("SELECT * FROM fecha WHERE evento_id = %d", 
    	intval($post['id'])
    );
    $fecha_result = mysql_query($query);
    
    // Guarda las fechas
    while ($fecha = mysql_fetch_assoc($fecha_result)) {
    	$Error->fechas['id'][] = $fecha['id'];
    	$Error->fechas['fecha'][] = $fecha['fecha'];
    	$Error->fechas['hora'][] = $fecha['hora'];
    	$Error->fechas['minuto'][] = $fecha['minuto'];
    }
    
    // Trae las locallidades
    $query = sprintf("SELECT * FROM localidad_evento WHERE evento_id = %d",
    	intval($post['id'])
    );
    $localidades_result = mysql_query($query);
    
    while ($localidad = mysql_fetch_assoc($localidades_result)) {
    	$Error->localidades['id'][] = $localidad['id'];
    	$Error->localidades['nombre'][] = $localidad['nombre'];
    	$Error->localidades['costo'][] = $localidad['costo'];
    }
    
    echo json_encode($Error);
    
    mysql_free_result($evento_result);
    mysql_close($conexion);
  }
  
  
  /**
   * 
   * Imprime el código javascript dentro del iframe para mostrar un mensaje
   * @param object $Error => El objeto que indica si hubo o no error
   * @author Joan Muñoz
   * 
   */
  public function printJavascript($Error) {
    echo '<script language="javascript" type="text/javascript">
        window.top.window.Eventos.showIframeMessage('. json_encode($Error) .');
        </script>';
  }
  
} // end class

/**
 * 
 * Manda llamar el constructor de la clase Evento.
 * Se recibe por GET el nombre del método llamar.
 * @author Joan Muñoz
 * 
 */
new Evento($_GET['action']);
?>